package xfuzzy.xfghl.population;

import java.util.ArrayList;
import java.util.List;

import xfuzzy.xfghl.codification.DoubleChromosome;

/**
 * Clase que representa una poblacion de individuos
 * @author Alberto David Fernandez Fernandez
 * */

public class Population {

	/**
	 * Lista de individuos de la poblacion
	 * */
	private List<DoubleChromosome> individuos;
	
	/**
	 * Constructor de la clase
	 * */
	
	public Population()  {
		
		this.individuos = new ArrayList<DoubleChromosome>();
	}
	
	/**
	 * Constructor de la clase
	 * @param individuos Individuos de la poblacion
	 * */
	
	public Population(List<DoubleChromosome> individuos)  {
		
		this.individuos = individuos;
	}
	
	public List<DoubleChromosome> getIndividuos() {
		return individuos;
	}
	
	public void setIndividuos(List<DoubleChromosome> individuos) {
		this.individuos = individuos;
	}
	
	/**
	 * Metodo que almacena un nuevo individuo en la poblacion
	 * @param individuo Individuo a almacenar
	 * */
	
	public void addIndividuo(DoubleChromosome individuo)  {
		
		this.individuos.add(individuo);
	}
	
	public void setIndividuo(int indice, DoubleChromosome nuevo)  {
		
		if (indice < this.individuos.size())
			this.individuos.set(indice, nuevo);
	}
	
	/**
	 * Metodo que devuelve un individuo de la poblacion
	 * @param indice Posicion del individuo en la poblacion
	 * @return DoubleChromosome Individuo a devolver
	 * */
	
	public DoubleChromosome getIndividuo(int indice)  {
		
		if (indice < this.individuos.size())
			return this.individuos.get(indice);
		return null;
	}
	
	/**
	 * Metodo que devuelve el mejor individuo de la poblacion
	 * @return DoubleChromosome Mejor individuo de la poblacion
	 * */
	
	public DoubleChromosome getBest()  {
		
		DoubleChromosome best = this.individuos.get(0);
		for (DoubleChromosome aux : this.individuos)  {
			 if (aux.getFitness() < best.getFitness())
				 best = aux;
		}
		return best;
	}
	
	public int getPoblacionSize()  {
		
		return this.individuos.size();
	}
	
	/**
	 * Muestra por pantalla los canonicos de toda la poblacion
	 * */
	
	public void viewCanonics()  {
		
		for (DoubleChromosome chromosome : this.individuos)
			 System.out.println(chromosome.getCanonic());
	}
}
